package main

import (
	"fmt"
	"time"
)

// 生产者函数，向channel中发送数据
func producer(ch chan<- int) {
	for i := 1; i <= 5; i++ {
		fmt.Printf("Producing: %d\n", i)
		ch <- i                            // 将数据发送到channel
		time.Sleep(500 * time.Millisecond) // 模拟生产耗时
	}
	close(ch) // 生产完成后关闭channel
}

// 消费者函数，从channel中接收数据
func consumer(ch <-chan int, done chan<- bool) {
	for num := range ch { // 从channel中读取数据，直到channel关闭
		fmt.Printf("Consuming: %d\n", num)
		time.Sleep(1 * time.Second) // 模拟消费耗时
	}
	done <- true // 消费完成后通知主函数
}

func main() {
	ch := make(chan int)    // 创建一个无缓冲的channel
	done := make(chan bool) // 创建一个channel用于通知消费完成

	go producer(ch)       // 启动生产者Goroutine
	go consumer(ch, done) // 启动消费者Goroutine

	<-done // 等待消费者完成
	fmt.Println("All tasks completed!")
}
